package ch.ifage.web;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
//import org.apache.log4j.Logger;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;
//import javax.enterprise.context.Conversation;
//import javax.enterprise.context.ConversationScoped;
import ch.ifage.business.dom.Assureur;
import ch.ifage.business.dom.Client;
import ch.ifage.business.dom.Police;
import ch.ifage.business.dom.Sinistre;
import ch.ifage.business.service.ServiceCourtier;

import org.primefaces.event.SelectEvent;  

/**
 * Gestion des enregistrements c'est � dire des ajouts et suppressions des instances dans le service.
 * @author Betty B�
 *
 */
/** Nom du Bean. */
@Named ("manage")
@SessionScoped
//@ConversationScoped

public class GestionEnregistrements implements Serializable {	
	
	/** logger par d�faut. */
	//private static final Logger LOGGER = Logger.getLogger(ManageStudentRegistration.class);
	/** serial-Id. */
	private static final long serialVersionUID = 1L;
	/** Le client � enregister. */
	private Client mClient;
	/** L'assureur � enregister. */
	private Assureur mAssureur;
	/** La police � enregister. */
	private Police mPolice;
	/** Le sinistre � enregister. */
	private Sinistre msinistre;
	/** Graphique montrant la prime et les indemnit�s. */
	private CartesianChartModel mCategoryModel; 
	/** Etat d'un bouton d'enregistrement. */
	private boolean mBouton1Desactive;
	/** Etat d'un bouton d'enregistrement. */
	private boolean mBouton2Desactive;
	/** Evenement g�n�r� par un clique. */
	private SelectEvent mEvent1;
	/** Evenement g�n�r� par un clique. */
	private SelectEvent mEvent2;
	
	/** Service inject� au bean. */
	@Inject
	@JPAImpl
	private ServiceCourtier serviceClient;
	
	//@Inject
	//private Conversation mConversation;

	/** *Constructeur qui g�n�re de nouvelles instances pour des enregistrements.
	 * les boutons d'enregistrement sont desactiv�s par d�faut */
	public GestionEnregistrements() {
		this.mClient = new Client();
		this.mAssureur = new Assureur();
		this.mPolice = new Police();
		this.msinistre = new Sinistre();
		//this.serviceClient = new ServiceClientImpl();	
		this.setBouton1Desactive(true);
		this.setBouton2Desactive(true);
	}
	/** * @param event
	 *    Lorsqu'une police est s�lectionn�e, le  bouton d'enregistrement est activ�
	 *    pour enregistrer un nouveau sinistre.*/
	public void onRowSelectP(final SelectEvent event) {
		FacesMessage msg = new FacesMessage("Policy Selected", ((Police) event.getObject()).getNumeroPolice());
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.activerBouton1();
	}
	/** * @param event1
	 *    Losqu'un client est s�lectionn�, le bouton d'enregistrement est activ�
	 *    pour enregister une nouvelle police.*/
	public void onRowSelectC(final SelectEvent event1) {
		this.mEvent1 = event1;
		FacesMessage msg = new FacesMessage("Customer Selected", ((Client) event1.getObject()).getRaisonSociale());
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.activerBouton2();
		
	}
	/** * @param event2
	 *    Losqu'un assureur est s�lectionn�, le bouton d'enregistrement est activ�
	 *    pour enregistrer une nouvelle police.*/
	public void onRowSelectA(final SelectEvent event2) {
		this.mEvent2 = event2;
		FacesMessage msg = new FacesMessage("Insurer Selected", ((Assureur) event2.getObject()).getRaisonSociale());
		FacesContext.getCurrentInstance().addMessage(null, msg);	
		this.activerBouton2();			
	}
	/** * @return l'�tat du bouton1. */
	public boolean getBouton1Desactive() {
		return mBouton1Desactive;
	}
	/** * @param bouton1Desactive
	 *    active ou d�sactive le bouton1.*/
	public void setBouton1Desactive(final boolean bouton1Desactive) {
		this.mBouton1Desactive = bouton1Desactive;
	}
	/** * @return l'�tat du bouton2. */
	public boolean getBouton2Desactive() {
		return mBouton2Desactive;
	}
	/** * @param bouton2Desactive
	 *    active ou d�sactive le bouton2.*/
	public void setBouton2Desactive(final boolean bouton2Desactive) {
		this.mBouton2Desactive = bouton2Desactive;
	}
	/** * @param 
	 *    active bouton1.*/
	public void activerBouton1() {
		this.setBouton1Desactive(false);
	}
	/** * @param 
	 *    Si une police et un client sont s�lectionn�s, le bouton d'enregistrement est activ�
	 *    pour enregsitrer un nouveau sinistre.*/
	public void activerBouton2() {
		if (mEvent1 == null || mEvent2 == null) {
			this.setBouton2Desactive(true);
		} else {
			this.setBouton2Desactive(false);
		}	
	}
	/** * @return ajoute un client au service et renvoie vers la liste des clients. */
	public String ajouterClient() {
		this.serviceClient.ajouter(this.mClient);
		//this.mConversation.end();
		return "verslisteclients";
	}
	/** * @return ajoute une police au service, lui attribue un assureur et un client
	 * et renvoie vers la liste des polices. */
	public String ajouterPolice() {
		this.mClient.getListePolices().add(this.mPolice);
		this.mAssureur.getListePolices().add(this.mPolice);
		this.mPolice.setAssureur(this.mAssureur);
		this.mPolice.setClient(this.mClient);
		this.serviceClient.ajouter(this.mPolice);
		//this.mConversation.end();
		return "verslistepolices";
	}
	/** * @return ajoute un sinistre, lui attribue une police et
	 * renvoie vers la liste des sinistres. */
	public String ajouterSinistre() {
		this.mPolice.getListeSinistres().add(this.msinistre);
		this.msinistre.setPolice(this.mPolice);
		this.serviceClient.ajouter(this.msinistre);
		//this.mConversation.end();
		return "verslistesinistres";
	}
	/** * @return ajoute un assureur au service et renvoie vers la liste des assureurs. */
	public String ajouterAssureur() {	
		this.serviceClient.ajouter(this.mAssureur);
		//this.mConversation.end();
		return "verslisteassureurs";
	
	}
	/** * @param p
	 *    une police.
	*  @return le total des indemnit�s vers�es pour une police donn�e.*/
	public Double totalI(final Police p) {
		Double totalI = 0.00;
		
		for (int i = 0; i < p.getListeSinistres().size(); i++) {			 											
			totalI += p.getListeSinistres().get(i).getIndemnite();	
		}
		return totalI;
	}
	/** * @param c
	 *    d�sactive toutes les polices d'un client supprim�
	 *    en leur attribuant le statut X.*/
	public void desactiverPolices(final Client c) {
		for (int i = 0; i < c.getListePolices().size(); i++) {
			c.getListePolices().get(i).setActif(false);
			c.getListePolices().get(i).setStatut("X");
		}
		
	}
	/** * @param a
	 *    d�sactive toutes les polices d'un assureur supprim�
	 *    en leur attribuant le statut X.*/
	public void desactiverPolices(final Assureur a) {
		for (int i = 0; i < a.getListePolices().size(); i++) {
			a.getListePolices().get(i).setActif(false);
			a.getListePolices().get(i).setStatut("X");
		}
		
	}
	/** * @param p
	 *    d�sactive tous les sinistres d'une police supprim�e
	 *    en leur attribuant le statut X.*/
	public void desactiverSinistre(final Police p) {
		for (int i = 0; i < p.getListeSinistres().size(); i++) {
			p.getListeSinistres().get(i).setActif(false);
			p.getListeSinistres().get(i).setStatut("X");
		}	
			
	}
	/** * @return supprime un client et d�sactive ses polices et sinistres
	 * puis raffraichi la page. */
	public String supprimerClient() {
		this.serviceClient.supprimer(this.getClientChoisi());
		this.desactiverPolices(this.getClientChoisi());
		for (int i  = 0; i < this.getClientChoisi().getListePolices().size(); i++) {
			this.desactiverSinistre(this.getClientChoisi().getListePolices().get(i));
		}
		return "refresh";
	}
	/** * @return supprime un assureur et d�sactive ses polices et sinistres
	 * puis raffraichi la page. */
	public String supprimerAssureur() {
		this.serviceClient.supprimer(this.mAssureur);
		this.desactiverPolices(this.getAssureurChoisi());
		for (int i = 0; i < this.getAssureurChoisi().getListePolices().size(); i++) {
			this.desactiverSinistre(this.getAssureurChoisi().getListePolices().get(i));
		}
		return "refresh";
	}
	/** * @return supprime une police et d�sactive ses sinistres
	 * puis raffraichi la page. */
	public String supprimerPolice() {
		this.serviceClient.supprimer(mPolice);
		this.mPolice.getClient().getListePolices().remove(this.mPolice);
		this.mPolice.getAssureur().getListePolices().remove(this.mPolice);
		this.desactiverSinistre(this.getPoliceChoisie());
		return "refresh";
	}
	/** * @return supprime un sinistre
	 * puis raffraichi la page. */
	public String supprimerSinistre() {
		this.serviceClient.supprimer(msinistre);
		this.msinistre.getPolice().getListeSinistres().remove(msinistre);
		return "refresh";
	}
	/** * @param client
	 *    sp�cifie le client s�lectionn�.*/
	public void setClientChoisi(final Client client) {
		this.mClient = client;
	}
	/** * @param police
	 *    sp�cifie le police s�lectionn�e.*/
	public void setPoliceChoisie(final Police police) {
		this.mPolice = police;
		
	}
	/** * @param assureur
	 *    sp�cifie l'assureur s�lectionn�.*/
	public void setAssureurChoisi(final Assureur assureur) {
		this.mAssureur = assureur;
		
	}
	/** * @param sinistre
	 *    sp�cifie le sinistre s�lectionn�.*/
	public void setSinistreChoisi(final Sinistre sinistre) {
		this.msinistre = sinistre;
	}	
	/** * @return le client selection�. */	
	public Client getClientChoisi() {
		return this.getClient();	
	}
	/** * @return la police selectionn�e. */
	public Police getPoliceChoisie() {
		return this.getPolice();
	}
	/** * @return l'assureur selectionn�. */	
	public Assureur getAssureurChoisi() {
		return this.getAssureur();
	}
	/** * @return le sinistre selectionn�. */	
	public Sinistre getSinistreChoisi() {
		return this.getSinistre();
	}
	/** * @return le sinistre selection�. */	
	public Client getClient() {
		return this.mClient;
	}
	/** * @return la police. */
	public Police getPolice() {
		return this.mPolice;
	}
	/** * @return l'assureur. */
	public Assureur getAssureur() {
		return this.mAssureur;
	}
	/** * @return le sinistre. */
	public Sinistre getSinistre() {
		return this.msinistre;
	}
	/** * @param nServiceClient
	 *    Le service � sp�cifier.*/
	public void setServiceClient(final ServiceCourtier nServiceClient) {
		this.serviceClient = nServiceClient;
	}
	/** * @return le service. */
	public ServiceCourtier getServiceClient() {
		return this.serviceClient;
	}
	/** * @return cr�ation d'un nouveau client
	 * puis redirection vers le formulaire d'enregsitrement. */
	public String versnouveauclient() {
		this.mClient = new Client();
		//this.mConversation.begin();
		return "versnouveauclient";
	}
	/** * @return cr�ation d'un nouvel assureur
	 * puis redirection vers le formulaire d'enregsitrement. */	
	public String versnouvelassureur() {
		this.mAssureur = new Assureur();
		//this.mConversation.begin();
		return "versnouvelassureur";
	}
	/** * @return cr�ation d'une nouvelle police
	 * puis redirection le formulaire d'enregsitrement. */
	public String versnouvellepolice() {
		this.mPolice = new Police();
		//this.mConversation.begin();
		return "versnouvellepolice";
	
	}
	/** * @return cr�ation d'un nouveau sinistre
	 * puis redirection vers le formulaire d'enregsitrement. */
	public String versnouveausinistre() {
		this.msinistre = new Sinistre();
		//this.mConversation.begin();
		return "versnouveausinistre";
	
	}
	/** * @param p
	 *    graphique montrant le rapport entre la prime et les indemnit�s
	 *    pour une police donn�e.
	 *    @return graphique*/		
	public CartesianChartModel categoryModel(final Police p) {  
						
		this.mCategoryModel = new CartesianChartModel();  
			   
		ChartSeries indem = new ChartSeries();  
		indem.setLabel("Indemnit�s");  
		indem.set(p.getNumeroPolice(), this.totalI(p)); 
			   
		ChartSeries pr = new ChartSeries();  
		pr.setLabel("Prime");  
		pr.set(p.getNumeroPolice(), p.getPrime());
			   
		this.mCategoryModel.addSeries(indem);  
		this.mCategoryModel.addSeries(pr);  
			 
			 return this.mCategoryModel;
			
		} 
	/** * @param prime
	 *    hauteur du graphique, soit 150 unit�s de plus que le montant de la prime
	 *    ainsi, visuellement,  la prime ne plafonnera pas.
	 *    @return graphique*/		
		public Double hauteurGraphique(final Double prime) {
			
			Double hauteurGraphique = prime + 150;
			
			return hauteurGraphique;
		}
		/** * @return d�connecte l'utilisateur de sa session et renvoie � la page d'accueil. */
		public String logout() {  
			FacesContext ctx = FacesContext.getCurrentInstance();  
			ExternalContext ectx = ctx.getExternalContext();  
			ectx.invalidateSession();  
			return "versaccueil";  
			}  		    
		
		
}	
